package com.lixw.aiassistant.service;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class MemoryService {

    @Resource
    private ChatMemory chatMemory;
    @Resource
    private ChatClient chatClient;

    /**
     * 获取历史上下文信息
     *
     * @param sessionId 会话id
     * @return 历史回话
     */
    public List<Message> getConversationContext(String sessionId) {
        return chatMemory.get(sessionId);
    }

    /**
     * 增强回话
     *
     * @param chatMessages    历史对话
     * @param currentQuestion 当前问题
     * @return 格式化后的提示词
     */
    public String formatChatHistory(List<Message> chatMessages, String currentQuestion) {
        // 关键：将历史对话融入当前问题的提示词中
        StringBuilder enhancedPrompt = new StringBuilder();
        enhancedPrompt.append("对话历史：\n");

        for (Message message : chatMessages) {
            enhancedPrompt.append(message.getMessageType())
                    .append(": ")
                    .append(message.getText())
                    .append("\n");
        }
        enhancedPrompt.append("当前问题：\n").append(currentQuestion);
        return enhancedPrompt.toString(); // 返回增强后的提示词
    }

    public void clearSession(String sessionId) {
        chatMemory.clear(sessionId);
    }

    public String getEnhancedPrompt(String formatedHistory,String currentQuestion) {
        String systemMessage = """
                你的任务是将用户的问题转换为更适合知识库检索的查询语句。
                
                分析对话历史和当前问题，解决代词指代问题：
                - 将"他"、"她"、"它"、"这个"、"那个"等代词替换为具体指代的实体
                - 整合必要的上下文信息
                - 保持查询简洁明确
                
                请直接返回增强后的查询语句，不要添加任何解释。""";
        String userMessage = """
                对话历史：%s\\n\\n原始问题：%s\\n\\n增强查询：
                """.formatted(formatedHistory,currentQuestion);
        return chatClient
                .prompt()
                .system(systemMessage)
                .user(userMessage)
                .call().content();
    }
}